
Let's get us some simplistic "beans binding" to support the <a href='http://www.martinfowler.com/eaaDev/PresentationModel.html'>Presentation Model</a> pattern.

We explicitly declare our properties so as to enjoy IDE auto-completion and refactoring capabilities. <i>"Wa wa wee wa!"</i> Cos string references are fragile with respect to renaming getters and setters, and so we avoid them, like whatsit, the plague ;)

<a href="https://code.google.com/p/vellum/">
<div style="border-bottom: solid 1px; background-color: yellow;"><img border=0 src="http://weblogs.java.net/blog/evanx/archive/kcoloredit.png" width="32" height="32" align="left" hspace="8"/> <b>Gooey Beans Info:</b> <i>A part of "Gooey Beans, a trilogy in 42 parts"</i></div></a>

We implement a POJO <a href='http://www.martinfowler.com/eaaDev/PresentationModel.html'><u>Presentation Model</u></a> object as follows.

<pre>
public class PersonModel {    
    private String firstNames;
    private String lastName;
    private String phone;
    private String email;
    private Date birthDate;
    private BigInteger idNumber;
    private BigDecimal creditScore;
    private Integer dependents;
    private PersonTitle title;
    private PersonGender gender;
    private PersonMaritalStatus maritalStatus;
    private Boolean confirmed;
    ...    
    @IntegerRangeValidator(minimum = 0, maximum = 9, inclusive = true)
    public void setDependents(Integer dependents) {
        this.dependents = dependents;
    }
    ...
}
</pre>
where we have illustrated a validation annotation. Alternatively we specify the um, properties' properties, including validators, in an explicit bean info class, as follows. This is <i>sans</i> magic, quite trivial and quite programmable. <i>"It's nice, I like. High five!"</i>

<pre>
public class PersonModelInfo extends QBeanInfo<PersonModel> {
    final QProperty firstNames = createProperty("firstNames");
    final QProperty lastName = createProperty("lastName");
    final QProperty phone = createProperty("phone");
    final QProperty email = createProperty("email");
    final QProperty birthDate = createProperty("birthDate");
    final QProperty idNumber = createProperty("idNumber");
    final QProperty creditScore = createProperty("creditScore");
    final QProperty dependents = createProperty("dependents");
    final QProperty title = createProperty("title");
    final QProperty gender = createProperty("gender");
    final QProperty maritalStatus = createProperty("maritalStatus");
    final QProperty confirmed = createProperty("confirmed");
    
    public PersonModelInfo() {
        super(PersonModel.class);
        birthDate.setFormatPattern("yyyy-MM-dd");        
        birthDate.setPropertyValueType(dateType);
        birthDate.addValidator(new QFutureDateValidator(false));
        email.setPropertyValueType(emailType);
        dependents.addValidator(new QIntegerRangeValidator(0, 9, false));
        title.setPropertyValueType(enumType);
        gender.setPropertyValueType(enumType);
        maritalStatus.setPropertyValueType(enumType);
        confirmed.setPropertyValueType(booleanType);
    }   
}
</pre>
We use the above info class to refer to our properties in an explicit, refactorable fashion. When we refactor our bean ie. rename properties (ie. their getter/setter methods) then we need to change the property name here, and we're good to go. Cos they're a pair like Mutt and Jeff.

<tt>QProperty</tt> stores additional information besides wrapping the underlying <tt>PropertyDescriptor</tt>, e.g. <tt>formatPattern</tt> and <tt>propertyValueType</tt> relate to formatting, and also there a list of validators.

<img src="http://weblogs.java.net/blog/evanx/archive/personInfoDependents700.png" width="700" height="334" />

You can refresh the "BeanInfo" tab (and also the "Console" tab) to see that the 
values entered into our form are written to our Presentation Model. 

<img src="http://weblogs.java.net/blog/evanx/archive/personInfoDependentsBean.png" width="700" height="330" />

where use <tt>formatPattern</tt> to override the default formatting for that <tt>propertyValueType</tt> (eg. date, timestamp, currency) and <tt>propertyType</tt> (e.g. <tt>Date</tt>, <tt>Integer</tt> et al).

<h2>Resources</h2>

https://code.google.com/p/vellum/ - where i will collate these articles and their code.
